package demo7;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Spring容器管理一个对象时，会在特定的生命周期过程中回调当前类中的方法，使当前类实例做对应操作
 * 例如：
 * 当Spring容器创建对象(实例)后，会回调当前类中的方法告知这一行为
 * 又或者对象即将销毁时，也会回调当前类中的方法告知这一行为
 * */
@Component
public class Person {
    private String name;
    public Person(){
        //构造器实际上是一个对象生命周期第一个被调用的函数
        System.out.println("1.Person对象的构造器被调用了");
    }

    public String getName() {
        return name;
    }

    @Value("张三")//通过@Value注解在Spring创建该对象时，利用属性对应的set方法为属性值初始化
    public void setName(String name) {
        this.name = name;
        System.out.println("2.Person对象的name属性的 setName()方法被调用了");
    }
    @PostConstruct
    /*
        @PostConstruct注解是告诉Spring容器，在当前对象初始化后，立即调用该方法
        Spring容器在创建并初始化当前对象后进行回调被该注解标注的方法
        因此，如果对象需要感知何时被Spring容器初始化完毕则可以任意定义一个方法然后使用该注解即可
    * */
    public void init(){
        System.out.println("3.Spring容器初始化Person对象了，调用了@PostConstruct标注的方法");
    }
    @PreDestroy
    /*
        当Spring容器关闭销毁当前对象时，容器会释放所有被管理的对象，此时如果该对象定义了一个方法并使用@PreDestory注解
        那么Spring这时会回调当前类中的方法通知该对象它即将被销毁
    * */
    public void destroy(){
        System.out.println("4.Spring容器要将当前Person对象销毁了，调用了@PerDestroy标注的方法");
    }
}
